has_many:在一个查询中用户是收件人还是作者的消息

atm*_*ell 5 ruby ruby-on-rails ruby-on-rails-3

我的消息模型属于作者和收件人。

belongs_to :recipient, :class_name => "User", :foreign_key => "recipient_id"
belongs_to :author, :class_name => "User", :foreign_key => "author_id"
Run Code Online (Sandbox Code Playgroud)

现在,我想做的是在User模型中建立has_many关系,该关系在单个查询中获取用户是以太作者或收件人的所有消息。我该怎么做?

has_many :messages, :finder_sql => ['author_id = #{self.id} or recipient_id = #{self.id}']
Run Code Online (Sandbox Code Playgroud)

但是,这打破了。

  User.first.messages
    User Load (0.6ms)  SELECT "users".* FROM "users" LIMIT 1
    Message Load (0.5ms)  author_id = #{self.id} or recipient_id = #{self.id}
  PGError: ERROR:  syntax error at or near "author_id"
  LINE 1: author_id = #{self.id} or recipient_id = #{self.id}
      ^
:author_id = #{self.id} or recipient_id = #{self.id} ActiveRecord::StatementInvalid:  PGError: ERROR:  syntax error at or near "author_id" LINE 1: author_id = #{self.id} or recipient_id = #{self.id}
Run Code Online (Sandbox Code Playgroud)

更新:插值变量已从Rails 3.1中删除。现在您必须使用proc

  has_many :messages, :finder_sql => proc { "SELECT * FROM messages WHERE author_id = #{self.id} or recipient_id = #{self.id}" }
Run Code Online (Sandbox Code Playgroud)

资源

Dog*_*ert 3

您不能在单引号中插入变量。

'author_id = #{self.id} or recipient_id = #{self.id}'
Run Code Online (Sandbox Code Playgroud)

应该

"author_id = #{self.id} or recipient_id = #{self.id}"
Run Code Online (Sandbox Code Playgroud)

  • 请参阅我的问题以获取解决方案。你必须在 Rails 3.1 中使用 proc (2认同)