Как мне сделать свой собственный запрос MySQL в рельсах 3? - PullRequest
4 голосов
/ 22 сентября 2011

Я пытаюсь отобразить недавно добавленные комментарии к татуировкам, опубликованным пользователем.Так что, если я опубликовал татуировку, а затем user_b опубликовал «эй, мне нравится твоя татуировка», то я пытаюсь получить только комментарий.

Прежде всего, я использую камень act_as_commentable_with_threading, который не создает внешний ключ для таблицыя пытаюсь присоединитьсяТак что мой контроллер не может искать tattoo_id, он должен искать commentable_id

В контроллере мне нужно было бы вызвать модель Comment и затем передать в нее некоторые SQL-компоненты, но, видимо, я понятия не имею, как передать пользовательский SQLзапросы в ruby, потому что даже если моя строка запроса работает в терминале, я получаю всякую чепуху, когда пытаюсь использовать ее в rails.

Я в основном пытаюсь сделать это:

SELECT comments.id FROM comments,tattoos WHERE commentable_id = tattoos.id AND 
tattoos.member_id = #{current_user}

где# {current_user} будет передаваться как current_user.

Ответы [ 2 ]

7 голосов
/ 22 сентября 2011

Вам не нужно прыгать через столько обручей, чтобы достичь этого.acts_as_commentable назначает полиморфную ассоциацию, поэтому вы должны настроить ее следующим образом:

class Comment < ActiveRecord::Base
  belongs_to :user
  belongs_to :commentable, :polymorphic => true
end

class Tattoo < ActiveRecord::Base
  has_many :comments, :as => :commentable
end

class User
  has_many comments
end

Затем вы можете получить доступ к ассоциации как обычно:

Tattoo.where(:member_id => current_user).first.comments

См. http://railscasts.com/episodes/154-polymorphic-association для общего учебника о том, как работают полиморфные ассоциации.Просто так получилось, что этот Railscast использует точно: commentable в качестве примера полиморфизма, так что вы сможете следовать непосредственно, если хотите.

4 голосов
/ 22 сентября 2011

Я думаю, что подход Бена лучше, но для дальнейшего использования, если вы столкнетесь с чем-то более сложным, вы всегда можете использовать sql, например:

Comment.find_by_sql("SELECT comments.* FROM comments,tattoos WHERE commentable_id = tattoos.id AND tattoos.member_id = ?", current_user)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...