Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails v4有很多关联的情况下,您怎么能有一个计算出的主键列呢_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 在Rails v4有很多关联的情况下,您怎么能有一个计算出的主键列呢

Ruby on rails 在Rails v4有很多关联的情况下,您怎么能有一个计算出的主键列呢,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我有一个Rails模型,它有一个hstore(使用hstore_访问器gem)。因此,当我在一个与hstore字段有许多关联的上设置主键时,生成的SQL只是在搜索NULL(Postgres) 那么,有没有办法定义一个自定义方法来计算关联的主键呢 如果我这样做: has_many :email_blocks, lambda { |cm| where(email_address: cm.email_address) }, foreign_key: :email_address 然后,我可以通过

我有一个Rails模型,它有一个hstore(使用hstore_访问器gem)。因此,当我在一个与hstore字段有许多关联的
上设置主键时,生成的SQL只是在搜索
NULL
(Postgres)

那么,有没有办法定义一个自定义方法来计算关联的主键呢

如果我这样做:

has_many :email_blocks, lambda { |cm| where(email_address: cm.email_address) },
  foreign_key: :email_address
然后,我可以通过以下SQL实现大部分目标:

SELECT "email_blocks".* FROM "email_blocks"
WHERE "email_blocks"."email_address" = '950b5f7b-9388-45f4-9c42-42e18337b09c'
AND "email_blocks"."email_address" = 'me@example.com'
但是检查关系主键的第一个子句是不必要的,因为此SQL将返回我想要的:

SELECT "email_blocks".* FROM "email_blocks"
WHERE "email_blocks"."email_address" = 'me@example.com'

最好的答案可能是——你没有。ActiveRecord是使用简单的自动索引ID或UUID作为主键和外键构建的。在ActiveRecord中使用复合或计算的PKs只会带来巨大的痛苦和痛苦,但收益非常有限。这是一个愚蠢的答案。ActiveRecord和其他任何工具一样只是一个工具,它内置了对许多类似情况的支持。例如,您可以显式设置
主键
外键
。这里不起作用的唯一原因是使用了hstore列。如果内置选项不起作用,编写自己的关系/关联就足够容易了。