Ruby on rails Rails所属的有许多数据库条件

Ruby on rails Rails所属的有许多数据库条件,ruby-on-rails,activerecord,relationship,rails-activerecord,Ruby On Rails,Activerecord,Relationship,Rails Activerecord,我有两个模型,比方说: Post: blog_id: integer external_id: integer Comment: blog_id: integer external_reference_id: integer 我的数据库中有一些项目: Post.create external_id: 10, title: "Test 1", blog_id: 1 Post.create external_id: 10, title: "Test 2", blog_id: 2

我有两个模型,比方说:

Post:
  blog_id: integer
  external_id: integer

Comment:
  blog_id: integer
  external_reference_id: integer
我的数据库中有一些项目:

Post.create external_id: 10, title: "Test 1", blog_id: 1
Post.create external_id: 10, title: "Test 2", blog_id: 2
Post.create external_id: 10, title: "Test 3", blog_id: 3

Comment.create external_reference_id: 10, title: "Comment 1.1", blog_id: 1
Comment.create external_reference_id: 10, title: "Comment 1.2", blog_id: 1

Comment.create external_reference_id: 10, title: "Comment 2.1", blog_id: 2
Comment.create external_reference_id: 10, title: "Comment 2.2", blog_id: 2
我需要使用外部参考来关联帖子和评论,即:

class Post < ActiveRecord::Base
    has_many :comments, foreign_key: :external_reference_id, primary_key: :external_id
end

class Comments < ActiveRecord::Base
    belongs_to :post, foreign_key: :external_reference_id, primary_key: :external_id
end
此解决方案在执行Post.first.comments时正确生成查询:

从comments.external_reference_id=?和comments.blog_id=1[[external_reference_id,10]]

但在尝试一些更深奥的东西(如Post)时,它失败得很惨。joins:comments.count giving:

到目前为止,我的解决方案是:

class Post < ActiveRecord::Base
  has_many :comments, -> (object){ where(object.respond_to?(:blog_id) ? "comments.blog_id = #{object.blog_id}" : 'comments.blog_id = posts.blog_id') }, foreign_key: :external_reference_id, primary_key: :external_id
end

这很好,但在我看来有点太复杂了。有更好的方法来实现这一点吗?

您可以添加:条件有很多并且属于,例如

class Post < ActiveRecord::Base
  has_many :comments, foreign_key: :external_reference_id, primary_key: :external_id, :conditions => ["comments.blog_id = posts.blog_id"]
end

class Comments < ActiveRecord::Base
  belongs_to :post, foreign_key: :external_reference_id, primary_key: :external_id, :conditions => ["comments.blog_id = posts.blog_id"]
end 

我没有测试过这一点,但试一试。

你能解释一下,我需要的是在blog\u id上确定两者之间的关系是否相同。。例如,与什么相同?我的意思是,评论只有在与blog_id字段匹配时才属于帖子。假设我在不同的服务器/数据库中有不同的博客,并且我正在主服务器中导入所有数据。我无法保留id,因此我将原始id保存在外部\u id中用于帖子,将原始帖子id保存在外部\u引用\u id中用于内容。因此,发表评论的帖子是一篇外部id与外部引用id匹配且具有相同博客id的帖子。我知道这可能不是更好的实现,但这是我现在的数据。啊,你应该将其添加到OP中,因为它是有用的信息。我也有同样的问题,并在这里找到了回应:这是我尝试过的事情之一,但当调用关系时,它不起作用:Comment.first.post仅在post表中进行查询,因此尝试使用comments.blog_id=posts.blog_id会中断查询:从posts.external_id=?和comments.blog_id=posts.blog_id按posts.id排序ASC LIMIT 1[[external_id,10]]
class Post < ActiveRecord::Base
  has_many :comments, -> (object){ where(object.respond_to?(:blog_id) ? "comments.blog_id = #{object.blog_id}" : 'comments.blog_id = posts.blog_id') }, foreign_key: :external_reference_id, primary_key: :external_id
end
class Post < ActiveRecord::Base
  has_many :comments, foreign_key: :external_reference_id, primary_key: :external_id, :conditions => ["comments.blog_id = posts.blog_id"]
end

class Comments < ActiveRecord::Base
  belongs_to :post, foreign_key: :external_reference_id, primary_key: :external_id, :conditions => ["comments.blog_id = posts.blog_id"]
end