Ruby on rails ActiveRecord在非默认值上加入嵌套关联

Ruby on rails ActiveRecord在非默认值上加入嵌套关联,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,在您询问之前,我无法控制在正在使用的数据库中创建任何视图或联接表 我在ActiveRecord文档中发现,您可以在其中进行多级加入: 12.2.4 Joining Nested Associations (Multiple Level) Category.joins(articles: [{ comments: :guest }, :tags]) This produces: SELECT categories.* FROM categories INNER JOIN articles

在您询问之前,我无法控制在正在使用的数据库中创建任何视图或联接表

我在ActiveRecord文档中发现,您可以在其中进行多级加入:

12.2.4 Joining Nested Associations (Multiple Level)

Category.joins(articles: [{ comments: :guest }, :tags])
This produces:

SELECT categories.* FROM categories
  INNER JOIN articles ON articles.category_id = categories.id
  INNER JOIN comments ON comments.article_id = articles.id
  INNER JOIN guests ON guests.comment_id = comments.id
  INNER JOIN tags ON tags.article_id = articles.id
以及在哪里可以指定要加入的内容

Client.joins('LEFT OUTER JOIN addresses ON addresses.client_id = clients.id')
我想做的是结合2

Client.joins('Inner Join addresses on addresses.client_name = client.name').joins('Inner Join state on state.abreviation = addresses.state_abreviation)
或者使用原始sql

Select client.* from client 
Inner Join addresses on client.client_name = addresses.client_name
Inner Join state on addresses.state_abreviation = state.abreviation
如果我可以使用关联而不是联接来实现这一点,那就太好了

class Category < ActiveRecord::Base
  has_many :articles
end

class Article < ActiveRecord::Base
  belongs_to :category
  has_many :comments
  has_many :tags
end

class Comment < ActiveRecord::Base
  belongs_to :article
  has_one :guest
end

class Guest < ActiveRecord::Base
  belongs_to :comment
end

class Tag < ActiveRecord::Base
  belongs_to :article
end
你可以用“通过” 对于您的类别模型,这些将如下所示

class Category < ActiveRecord::Base
  has_many :articles
  has_many :comments, through: :articles
  has_many :tags, through: :articles
end

Category.last.tags
=> tags
Category.last.articles
=> articles
使用Arel:

c = Client.arel_table
a = Adress.arel_table
s = State.arel_table
query = Client.all.arel
         .join(a)
           .on(a[:client_name].eq(c[:client_name]))
         .join(s)
           .on(s[:abreviation].eq(a[:state_abreviation]))
Client.find_by_sql(query.to_sql)

我找到了答案。您需要为表定义外键,以便可以将其映射回

  belongs_to :addresses, foreign_key: 'state_abreviation'

看起来有一个地址表和关联的模型,您在这里省略了。是这样吗?@San我想说的是,我想要做的是将您描述的活动记录模型与关联结合起来,这与您在第二次连接请求中编写的表和模型不同。这很混乱,与活动记录模式不匹配。这根本不能解决我的问题。我正在寻找如何进行自定义列关联我为db schema编写了答案,您描述了用户无法理解您的答案,因为在问题中,您没有描述您的数据库结构很好,您查看了rails手册:……aa这只是您问题的开始:尝试使用查询和更复杂的范围来扩展此功能,请参见