Is there anyone who can suggest me the solution for a Find_by_sql query
here when I am using mysql that work perfect . But when I converted that
into active record It is not showing the exact result . First I have
tried this code below using find_by_sql:
@message3 = Message.find_by_sql(["SELECT u.id,c.m_id,u.name,u.email
FROM messages c, users u
WHERE (CASE
WHEN c.user_one = :id
THEN c.user_two = u.id
WHEN c.user_two = #{current_user.id}
THEN c.user_one= u.id
END )
AND (
c.user_one ='1'
OR c.user_two ='1'
)
Order by c.m_id DESC Limit 20", {:id => current_user.id}])
When I am using this query I am getting the exact value which I want but
when I am doing this thing in active record way it is not working well
SO here is the code which I have tried in active record style :
@m1 =
Message.joins(:user).select("users.id,messages.m_id,users.name,users.email").where("CASE
WHEN messages.user_one = #{current_user.id} THEN messages.user_two =
users.id WHEN messages.user_two = #{current_user.id} THEN
messages.user_one = users.id END").where("messages.user_one = 1 OR
messages.user_two = 1 ").order("messages.m_id DESC")
When I am running this query I am getting this generate query :
SELECT users.id,messages.m_id,users.name,users.email FROM `messages`
INNER JOIN `users` ON `users`.`id` = `messages`.`user_one` WHERE (CASE
WHEN messages.user_one = 1 THEN messages.user_two = users.id WHEN
messages.user_two = 1 THEN messages.user_one = users.id END) AND
(messages.user_one = 1 OR messages.user_two = 1 ) ORDER BY
messages.m_id DESC
Both these query look same but when I am using find_by_sql method I am
getting two results but when I am reunnig query of active record it is
only showing one when I paste the generated sql in mysql there also I am
getting same result IF anyone can help me to understand the difference
between these two queries and how can I fix this I mean I need the
result of find_by_sql in active record .
I'm pretty sure this is different than what you posted last time.
And you might try giving a real answer to Elizabeth's question--that looks suspiciously like a bad schema design.
Anyway the answer to your immediate question is obviously in the join. You have this extremely strange join condition between the 2 tables, which you specify in that oddball case statement in the where clause. But you also have some has_many/belongs_to declarations in you model classes, and so when you try to use AREL, it adds what it believes to be the correct inner join clause, which restricts to... Well, just read the generated query and pay attention to the inner join clause to see what it's doing
Answer 1 is: fix your schema. Answer 2 is: if you cannot do that, then stick with find_by_sql because AREL's join method is never going to be able to cope with that structure.
Fixing a schema is other thing this very straight forward question how
can I generate the query which I am using in find_by_sql or is there any
mechanism where I can select two tables without join and use the case
and when . Or can you tell me how to right exact query where I can get
the result like case when and then .
you need to show us your schema for a better answer (or at least the
parts of the schema that are involved in the question)
and I'm having problems understanding what you write, there are no
commas, no points, no new lines, ...
Rodrigo Urubatan Ferreira Jardim
Architect, Developer and Technical Writer
urubatan@gmail.com
Visite meu blog: http://www.urubatan.com.br
No user table does not contail foreign key user_one infact message table contain user_one when I am using this has_many :messages,class_name: “Message”,
foreign_key: “user_one” I in user model I ma getting the error what should I do to get the exact result help me .