[英]Active Record Association without using id
我不太确定还没有答案,但是我不确定要搜索什么,因此如果我要问的是已经回答的问题,请指出正确的方向。
我有2个型号:
stock_symbol和weight_symbol
stock_symbol中具有与weight_symbol模型中的commodity
匹配的symbol
如何获得关联才能工作,所以当我执行stock_symbol.weight_symbol时,我将获得weight_symbol。
我知道如何在SQL中执行此操作,但是如果它不是this_id
的标准id
,那么我就迷路了。
编辑:
class StockSymbol < ActiveRecord::Base
has_many :weight_symbols, primary_key: :symbol
def commodity
"LC" # This is just an example to simplify it, there is much more to this.
end
end
class WeightSymbol < ActiveRecord::Base
belongs_to :stock_symbol, foreign_key: :commodity
end
stock_symbol中的样本对象:
StockSymbol.last
<#StockSymbol id: 729, symbol: "LCJ13C12500", created_at: "2013-03-15 21:50:49", updated_at: "2013-03-15 21:50:49">
weight_symbol中的样本对象:
WeightSymbol.first
<#WeightSymbol id:1, weight_group_id: 1, symbol: "LC", created_at: "2010-01-05 21:13:28", updated_at: "2010-01-05 21:13:28">
设置并运行StockSymbol.last.weight_symbols.to_sql
我得到:
"SELECT `weight_symbols`.* FROM `weight_symbols` WHERE `weight_symbols`.`stock_symbol_id` = 'LCJ13C12500'"
编辑2:
查询它应该做的(我认为):
SELECT * FROM `weight_symbols` WHERE `weight_symbols`.`symbol` = 'LC';
查询以获取所需的信息。
SELECT * FROM `weight_symbols` a
JOIN `stock_symbols` b
ON a.symbol = b.commodity
WHERE b.symbol = 'LCJ13C12500';
新股票代码对象
<#StockSymbol id: 729, symbol: "LCJ13C12500", created_at: "2013-03-15 21:50:49", updated_at: "2013-03-15 21:50:49", commodity: "LC">
rails关联方法带有用于覆盖关系中使用的默认键的选项。 如果它是StockSymbol
和WeightSymbol
之间的一对多关联,则使用以下代码:
# stock_symbol.rb
has_many :weight_symbols, primary_key: :symbol
# weight_symbol.rb
belongs_to :stock_symbol, foreign_key: :commodity
(不确定我是否正确找到了关联,但是您应该知道这个主意。)
协会基础guid中的“ 详细协会参考 ” 详细列出了属于每种协会类型的所有选项和方法。
编辑 :根据您更新的问题一些额外的东西。
对于您的关联应该如何工作,我有些困惑WeightSymbol
似乎没有commodity
属性。 如果一个WeightSymbol
匹配到它所属的StockSymbol
当weight_symbol.symbol == stock_symbol.commodity
? 在这种情况下,您需要相应地设置密钥:
# stock_symbol.rb
has_many :weight_symbols, primary_key: :commodity
# :primary_key is the field on this model whose value associated models will store in their foreign_key
# weight_symbol.rb
belongs_to :stock_symbol, foreign_key: :symbol
# :foreign_key is the column on this model that should match the primary_key field in the associated model
其次,您只能使用数据库列设置Rails关联,而不能使用方法。 如果您绝对必须使用一种方法,则可能会伪造该关联,例如使用类似以下内容的伪造:
# stock_symbol.rb
def weight_symbol
WeightSymbol.find_by_symbol(self.commodity)
end
不利的一面是它的效率极低,并且会大量重新设计所涉及的轮子。
如果您可以选择将commodity
设为数据库字段,那将是最好的解决方案,具体取决于它可能会更改的频率。 例如,如果它是从模型的当前状态派生的,则可以在模型上设置一个before_save
过滤器,以执行需要进行的任何处理并将适当的值写入该字段:
# stock_symbol.rb
before_save :set_commodity
def set_commodity
commodity = "LC" # arrived at through whatever processing you do
self.commodity = commodity
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.