I-a*_*ser 3 mysql ruby-on-rails ruby-on-rails-3
我有下表 4 个模型
class ItemCode < ActiveRecord::Base
belongs_to :item_point
end
class ItemPoint < ActiveRecord::Base
belongs_to :item
has_many :item_codes
end
class Item < ActiveRecord::Base
belongs_to :prodcut_category
has_many :item_points
end
class ProductCategory < ActiveRecord::Base
has_many :items
end
Run Code Online (Sandbox Code Playgroud)
现在我必须使用product_category找到item_codes详细信息,为此我使用了内部联接。这是mysql查询
SELECT *
FROM `item_codes` utc
INNER JOIN item_points rtp ON rtp.id = utc.item_point_id
INNER JOIN items ri ON ri.id = rtp.item_id
INNER JOIN product_catagories rpc ON rpc.id = ri.product_catagory_id
WHERE rpc.id =1
LIMIT 0 , 30
Run Code Online (Sandbox Code Playgroud)
现在我必须以 Acitve 记录格式编写相同的查询。
ItemCode.joins(:item_point).joins(:item).joins(:product_catagory).where("product_catagories.id = 1")
Run Code Online (Sandbox Code Playgroud)
得到以下错误
ActiveRecord::ConfigurationError: Association named 'item_points' was not found; perhaps you misspelled it?
Run Code Online (Sandbox Code Playgroud)
那么如何以活动记录格式编写给定的查询。
编辑
产品目录
+----------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| client_id | int(11) | YES | | NULL | |
| category_name | varchar(255) | YES | | NULL | |
| category_description | varchar(255) | YES | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
| scheme_id | int(11) | YES | MUL | NULL | |
+----------------------+--------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
item_points
+----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| item_id | int(11) | YES | MUL | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
+----------------+--------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
项目
+------------------------------+--------------+----- -+-----+------------+------------
----+
| Field | Type | Null | Key | Default | Extra |
+----------------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
| product_catagory_id | int(11) | YES | MUL | NULL | |
+----------------------------+--------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
item_codes
+----------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| item_point_id | int(11) | YES | MUL | NULL | |
+----------------------+--------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
尝试这个:
ItemCode.joins(item_point: {item: :product_category}).where(product_category: {id: 1})
Run Code Online (Sandbox Code Playgroud)
让我简化连接表:
当您有直接关系时:
# item_code belongs_to item_point
ItemCode.joins(:item_point)
# ItemPoint has_many item_codes & belongs_to item
ItemPoint.joins(:item_codes, :item)
Run Code Online (Sandbox Code Playgroud)
当您有间接/嵌套关系时:
# ItemCode belongs_to item_point, item_point belongs_to item
ItemCode.joins(item_point: :item)
# ItemCode belongs_to item_point, item_point belongs_to item, item belongs_to product_category
ItemCode.joins(item_point: {item: :product_category})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1067 次 |
| 最近记录: |